package gt

import (
	"github.com/spf13/viper"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"log"
	"os"
)

var (
	LogOut           string
	LogModel         string
	LogLevel         string
	LogPath          string
	LogMaxSize       int
	LogMaxBackups    int
	DnsPodEnable     bool
	DnsPodLoginToken string
	DnsPodDomainName string
	DnsPodDomainHost string
	DnsPodDomainType string
	DnsPodDomainLine string
	DnsPodDomainTTL  string
	CronSpec         string
)
var Loggerzap *zap.Logger

/*
初始化配置文件
*/
func init() {
	//保证只执行一次
	viper.SetConfigName("config") //指定配置文件的文件名称(不需要制定配置文件的扩展名)
	//viper.AddConfigPath("/etc/appname/")   //设置配置文件的搜索目录
	//viper.AddConfigPath("$HOME/.appname")  // 设置配置文件的搜索目录
	viper.AddConfigPath("./configs/") // 设置配置文件和可执行二进制文件在用一个目录
	viper.SetConfigType("yaml")
	err := viper.ReadInConfig() // 根据以上配置读取加载配置文件
	if err != nil {
		log.Fatal(err) // 读取配置文件失败致命错误
	}

	LogOut = viper.GetString("log.out")
	LogModel = viper.GetString("log.model")
	LogLevel = viper.GetString("log.level")
	LogPath = viper.GetString("log.path")
	LogMaxSize = viper.GetInt("log.maxsize")
	LogMaxBackups = viper.GetInt("log.maxbackups")
	DnsPodEnable = viper.GetBool("dnspod.enable")
	DnsPodLoginToken = viper.GetString("dnspod.loginToken")
	DnsPodDomainName = viper.GetString("dnspod.domain.name")
	DnsPodDomainHost = viper.GetString("dnspod.domain.host")
	DnsPodDomainType = viper.GetString("dnspod.domain.type")
	DnsPodDomainLine = viper.GetString("dnspod.domain.line")
	DnsPodDomainTTL = viper.GetString("dnspod.domain.ttl")
	CronSpec = viper.GetString("cron")

}

/*
初始化日志实例
*/
func init() {
	Loggerzap = getConfigLogger()
}

func getConfigLogger() *zap.Logger {
	hook := lumberjack.Logger{
		Filename:   LogPath,       // 日志文件路径
		MaxSize:    LogMaxSize,    // 每个日志文件保存的最大尺寸 单位：M
		MaxBackups: LogMaxBackups, // 日志文件最多保存多少个备份
	}

	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "caller",
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小写编码器
		EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601 UTC 时间格式
		EncodeDuration: zapcore.SecondsDurationEncoder, //
		EncodeCaller:   zapcore.FullCallerEncoder,      // 全路径编码器
		EncodeName:     zapcore.FullNameEncoder,
	}
	// 设置日志级别info、debug、error、info
	atomicLevel := zap.NewAtomicLevel()
	loglevel := TrimSpaceToLower(LogLevel)
	if loglevel == "info" {
		atomicLevel.SetLevel(zap.InfoLevel)
	} else if loglevel == "debug" {
		atomicLevel.SetLevel(zap.DebugLevel)
	} else if loglevel == "error" {
		atomicLevel.SetLevel(zap.ErrorLevel)
	} else {
		atomicLevel.SetLevel(zap.InfoLevel)
	}
	/*
		日志输出控制台、文件选择
	*/
	logout := TrimSpaceToLower(LogOut)
	var core zapcore.Core
	if logout == "console" {
		//设置日志输出
		core = zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig), // 编码器配置
			zapcore.AddSync(os.Stdout),            // 打印到控制台和文件
			atomicLevel,                           // 日志级别
		)
	} else if logout == "file" {
		//设置日志输出
		core = zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig), // 编码器配置
			zapcore.AddSync(&hook),                // 打印到控制台和文件
			atomicLevel,                           // 日志级别
		)
	} else {
		core = zapcore.NewCore(
			zapcore.NewJSONEncoder(encoderConfig),                                           // 编码器配置
			zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件
			atomicLevel,                                                                     // 日志级别
		)
	}

	/*
		日志类型  生产 开发
	*/
	logmodel := TrimSpaceToLower(LogModel)
	if logmodel == "develop" {
		// 开启开发模式，堆栈跟踪
		caller := zap.AddCaller()
		// 开启文件及行号
		development := zap.Development()
		// 设置初始化字段
		//filed := zap.Fields(zap.String("serviceName", "serviceName"))
		// 构造日志
		//logger := zap.New(core, caller, development, filed)
		logger := zap.New(core, caller, development)
		return logger
	} else {
		logger := zap.New(core)
		return logger
	}

}
